#ifndef __USER_CONFIG_H
#define __USER_CONFIG_H

#include "stm32f10x.h"

/* ===================== 阈值参数配置 ===================== */

// 流量阈值
#define UV_FLOW_THRESHOLD       0.3f    // 单位: L/min

// 湿度阈值
#define HUMIDITY_THRESHOLD      80.0f   // 单位: %RH

// UV辐射度阈值
#define UV_RADIATION_THRESHOLD  600    // 单位: 辐射度值,小于此值表示杀菌效果不好

// UV灯寿命
#define UV_LIFETIME_HOURS       8000    // 单位: 小时
#define UV_LIFETIME_SECONDS     (UV_LIFETIME_HOURS * 3600UL)  // 转换为秒

// 定时开关默认配置
#define UV_TIMER_WAIT_TIME_SEC  (30 * 60)  // 30分钟等待时间
#define UV_TIMER_WORK_TIME_SEC  (10 * 60)  // 10分钟工作时间

// EEPROM保存间隔
#define EEPROM_SAVE_INTERVAL_SEC  (5 * 60)  // 5分钟


/* ===================== GPIO控制宏定义 ===================== */

// UV灯控制 (PA8)
#define UvLight_Open   GPIO_SetBits(GPIOA, GPIO_Pin_8)    // 高电平打开
#define UvLight_Close  GPIO_ResetBits(GPIOA, GPIO_Pin_8)  // 低电平关闭

// UV灯状态读取 (PC9, 低电平=灯开)
#define Read_Uv_State  GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_9)

// 电磁阀控制 (PB4, 常开阀,断电开启,通电关闭)
#define Valve_Open     GPIO_ResetBits(GPIOB, GPIO_Pin_4)  // 低电平开启
#define Valve_Close    GPIO_SetBits(GPIOB, GPIO_Pin_4)    // 高电平关闭

// 手动按键读取 (PC3, 假设低电平有效) - 已改为"更换成功"按键
#define Read_Manual_Key  GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3)


/* ===================== UV控制状态机枚举 ===================== */

typedef enum
{
    UV_STATE_INIT = 0,              // 初始化
    UV_STATE_CIRCUIT_CHECK,         // UV电路检测(暂不实现)
    UV_STATE_HUMIDITY_CHECK,        // 湿度检测
    UV_STATE_WORKTIME_CHECK,        // UV工作时间检测
    UV_STATE_IGNORE2_CHECK,         // "忽略2"标志位检测
    UV_STATE_FLOW_CHECK,            // 流量检测
    UV_STATE_RADIATION_CHECK,       // UV辐射度检测
    UV_STATE_RUNNING,               // 正常运行
    UV_STATE_LOCKED_WORKTIME,       // 锁定状态-工作时间超时
    UV_STATE_LOCKED_RADIATION,      // 锁定状态-辐射度不足
} uv_state_t;


/* ===================== UV定时器状态枚举(旧,保留但不使用) ===================== */

typedef enum
{
    UV_TIMER_IDLE,      // 等待中 (30分钟)
    UV_TIMER_WORKING    // 工作中 (10分钟)
} UvTimerState_t;


/* ===================== 系统工作状态枚举(旧,保留但不使用) ===================== */

typedef enum
{
    SYS_STATE_INIT,          // 初始化状态
    SYS_STATE_STANDBY,       // 待机状态(无流量)
    SYS_STATE_UV_WORKING,    // UV灯工作中(流量触发)
    SYS_STATE_TIMER_WORKING, // UV灯工作中(定时触发)
    SYS_STATE_MANUAL,        // 手动模式
    SYS_STATE_LEAK_PROTECT,  // 漏水保护
    SYS_STATE_ERROR          // 错误状态
} SystemState_t;


/* ===================== UV定时器配置结构体 ===================== */

typedef struct
{
    u8 enable;                      // 定时功能使能标志 (1=使能, 0=禁用)
    UvTimerState_t state;           // 当前状态 (等待中/工作中)
    u32 wait_time_sec;              // 等待时间(秒) 默认30*60
    u32 work_time_sec;              // 工作时间(秒) 默认10*60
    u32 current_timer_sec;          // 当前计时器(秒)
} UvTimerConfig_t;


/* ===================== EEPROM数据结构体 ===================== */

typedef struct
{
    u32 uv_work_time_sec;           // UV灯累计工作时间(秒)
    float total_flow_liters;        // 累计流量(升)
    u8 valid_flag;                  // 数据有效标志 (0x5A=有效)
} EepromData_t;


/* ===================== 用户配置主结构体 ===================== */

typedef struct
{
    // ========== 系统状态(旧,保留) ==========
    SystemState_t system_state;     // 系统当前状态
    u8 manual_mode;                 // 手动模式标志 (1=手动模式, 0=正常模式)

    // ========== UV控制状态机(新) ==========
    uv_state_t uv_state;            // UV状态机当前状态
    u8 uv_current_mode;             // UV灯电流模式 (0=关闭, 1=10%电流, 2=100%电流)
    u32 uv_total_work_hours;        // UV累计工作时间(小时)
    u8 uv_ignore_flag1;             // "忽略1"标志位 (1=已设置)
    u8 uv_ignore_flag2;             // "忽略2"标志位 (1=已设置)

    // ========== UV灯相关(旧,部分保留) ==========
    u8 uv_is_working;               // UV灯工作状态 (1=工作中, 0=关闭)
    u32 uv_work_time_sec;           // UV灯累计工作时间(秒) - 旧变量,保留兼容
    u8 uv_lifetime_warning;         // UV灯寿命警告标志 (1=需要更换)
    UvTimerConfig_t uv_timer;       // UV定时器配置 - 旧变量,不再使用

    // ========== 电磁阀相关 ==========
    u8 valve_is_open;               // 电磁阀状态 (1=打开, 0=关闭)

    // ========== 传感器数据 ==========
    float flow_instant;             // 瞬时流量 (L/min)
    float flow_total;               // 累计流量 (L)
    float humidity;                 // 湿度 (%RH)
    s16 temperature;                // 温度 (℃)
    u32 uv_radiation;               // UV辐射度值
    u8 uv_circuit_fault;            // UV电路故障标志 (1=短路, 0=正常)

    // ========== 阈值配置(新) ==========
    u16 humidity_threshold;         // 湿度阈值 (默认50%)
    u16 flow_threshold;             // 流量阈值 (默认100 L/H)
    u16 uv_value_100;               // UV辐射度标准值 (默认1000,需校准)

    // ========== 保护与警告 ==========
    u8 leak_detected;               // 漏水检测标志 (1=检测到漏水, 0=正常)
    u8 leak_protect_active;         // 漏水保护激活标志 (1=保护中, 0=正常)

    // ========== EEPROM管理 ==========
    u32 last_save_time_sec;         // 上次保存时间戳(秒)
    u8 need_save_flag;              // 需要保存标志 (1=需要保存)

    // ========== 按键去抖 ==========
    u8 key_state;                   // 按键状态寄存器

    // ========== 系统时间 ==========
    u32 system_tick_sec;            // 系统运行时间(秒) - 在TIM7中每秒累加

} user_config_t;


/* ===================== 全局变量声明 ===================== */

extern user_config_t g_user_config;


/* ===================== 函数声明 ===================== */

/**
 * @brief  初始化用户配置结构体
 * @param  None
 * @retval None
 */
void user_config_init(void);

/**
 * @brief  系统时间tick更新 (每1秒调用一次)
 * @param  None
 * @retval None
 * @note   在TIM7中断中调用,用于EEPROM自动保存等功能
 */
void user_config_tick_1s(void);

/**
 * @brief  按键去抖动读取
 * @param  None
 * @retval 1=按键按下, 0=按键释放
 */
u8 user_config_read_key_debounced(void);


#endif /* __USER_CONFIG_H */
